package vues;


import java.awt.Color;
import java.awt.Font;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JColorChooser;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.TransferHandler;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;

import logique.parser.factories.ClassementFactory;
import logique.parser.factories.TailleVilleFactory;
import logique.preferences.CritereClassementTroncon;
import logique.preferences.CritereTailleVille;
import logique.preferences.CritereTronconRadar;
import logique.preferences.CritereTronconTouristique;
import logique.preferences.CritereVilleTouristique;
import logique.preferences.CritereVitesseTroncon;
import logique.reseau.atouts.ATTGenerique;
import logique.reseau.atouts.ATVGenerique;
import logique.reseau.caracteristiques.Radar;
import logique.reseau.classements.Classement;
import logique.reseau.tailles.TailleVille;

import com.visutools.nav.bislider.BiSlider;
import com.visutools.nav.bislider.BiSliderEvent;
import com.visutools.nav.bislider.BiSliderListener;

/**
 * 
 * @author Matthieu
 *
 */
public class PanelPrefAvancees extends JPanel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 4801576933635186448L;

	// ATTRIBUTES //
	private boolean verbose = false;
	private InterfacePrincipale gps;
	
	private JLabel labelChoixTypeVille;
	private JScrollPane scrollPaneChoixTypeVille;
	public javax.swing.JList listeChoixTypeVille;
	private javax.swing.JScrollPane scrollPaneChoixTypeVilleNon;
	public javax.swing.JList listeChoixTypeVilleNon;
	private javax.swing.JScrollPane scrollPaneChoixTypeVilleOui;
	public javax.swing.JList listeChoixTypeVilleOui;
	
	private javax.swing.JLabel labelChoixTypeRoute;
	private javax.swing.JScrollPane scrollPaneChoixTypeRoute;
	public javax.swing.JList listeChoixTypeRoute;
	private javax.swing.JScrollPane scrollPaneChoixTypeRouteNon;
	public javax.swing.JList listeChoixTypeRouteNon;
	private javax.swing.JScrollPane scrollPaneChoixTypeRouteOui;
	public javax.swing.JList listeChoixTypeRouteOui;

	private javax.swing.JLabel labelOrdrePrefAvancees;
	private javax.swing.JScrollPane scrollPanePrefAvancees;
	public JList listePrefAvancees;
	private javax.swing.JButton boutonPrefAvanceesHaut;
	private javax.swing.JButton boutonPrefAvanceesBas;

	private javax.swing.JButton boutonRetourPreferences;
	private javax.swing.JButton boutonLanceNavigation;
	
	public String listeOrigine;
	public boolean isDragging = false;
	public JList origineDragging = null;
	public JList listeSurvol = null;

	private PanelPrefSimples panelPrefSimples;
	
	private BiSlider biSlider;
	private double vitesseMin;
	private double vitesseMax;
	
	// METHODS //
	public PanelPrefAvancees(InterfacePrincipale gps) {
		// Enregistrement de la reference sur la fenetre principale
		this.gps = gps;
		
		// Initialisation du panel
		listeChoixTypeVilleNon = new javax.swing.JList();
		listeChoixTypeVilleOui = new javax.swing.JList();
		listeChoixTypeVille = new javax.swing.JList();
		listeChoixTypeRoute = new javax.swing.JList();
		listeChoixTypeRouteNon = new javax.swing.JList();
		listeChoixTypeRouteOui = new javax.swing.JList();
		boutonLanceNavigation = new javax.swing.JButton();
		boutonRetourPreferences = new javax.swing.JButton();
		boutonPrefAvanceesHaut = new javax.swing.JButton();
		boutonPrefAvanceesBas = new javax.swing.JButton();
		scrollPaneChoixTypeVilleNon = new javax.swing.JScrollPane();
		scrollPaneChoixTypeVilleOui = new javax.swing.JScrollPane();
		scrollPaneChoixTypeVille = new javax.swing.JScrollPane();
		scrollPaneChoixTypeRoute = new javax.swing.JScrollPane();
		scrollPaneChoixTypeRouteNon = new javax.swing.JScrollPane();
		scrollPaneChoixTypeRouteOui = new javax.swing.JScrollPane();
		scrollPanePrefAvancees = new javax.swing.JScrollPane();
		labelChoixTypeVille = new javax.swing.JLabel();
		labelChoixTypeRoute = new javax.swing.JLabel();
		labelOrdrePrefAvancees = new javax.swing.JLabel();
		listeOrigine = new String("empty");
		ListDataHandler listDataHandler = new ListDataHandler();
		
		this.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());
		
		// Creation du slider de vitesse min/max
		biSlider = new BiSlider();
		biSlider.setVisible(true);
		biSlider.setMinimumValue(50);
		vitesseMin = 50.0;
		biSlider.setMaximumValue(130);
		vitesseMax = 130.0;
		biSlider.setSegmentSize(20);
		biSlider.setMinimumColor(Color.BLUE);
		biSlider.setMaximumColor(Color.RED);
		biSlider.setUnit("km/h");
		biSlider.setPrecise(true);
		
		final JPopupMenu JPopupMenu1 = biSlider.createPopupMenu();
		biSlider.addMouseListener(new MouseAdapter(){
			public void mousePressed(MouseEvent MouseEvent_Arg){
				if (MouseEvent_Arg.getButton()==MouseEvent.BUTTON3){
					JPopupMenu1.show(biSlider, MouseEvent_Arg.getX(), MouseEvent_Arg.getY());
				}
			}
		});


		biSlider.addMouseListener(new MouseAdapter(){
			public void mousePressed(MouseEvent MouseEvent_Arg){
				if (!MouseEvent_Arg.isConsumed() && MouseEvent_Arg.getButton()==MouseEvent.BUTTON1 && MouseEvent_Arg.getClickCount()==2){
					Color Color1 = JColorChooser.showDialog(biSlider, "Choose a color for minimum values", biSlider.getMinimumColor());
					if (Color1!=null)
						biSlider.setMinimumColor(Color1);
					biSlider.repaint();
				}
			}
		});
		
		biSlider.addBiSliderListener(new BiSliderListener() {

			@Override
			public void newColors(BiSliderEvent BiSliderEvent_Arg) {}

			@Override
			public void newMaxValue(BiSliderEvent BiSliderEvent_Arg) {}

			@Override
			public void newMinValue(BiSliderEvent BiSliderEvent_Arg) {}

			@Override
			public void newSegments(BiSliderEvent BiSliderEvent_Arg) {}

			@Override
			public void newValues(BiSliderEvent BiSliderEvent_Arg) {
				vitesseMin = BiSliderEvent_Arg.getMinimum();
				vitesseMax = BiSliderEvent_Arg.getMaximum();
			}
			
		});
		
		JPanel panelSlider = new JPanel();
		panelSlider.add(biSlider);
		this.add(panelSlider, new org.netbeans.lib.awtextra.AbsoluteConstraints(495, 300, -1, -1));
		
		// Label choix type ville
		labelChoixTypeVille.setText("Choix des types de ville:");
		this.add(labelChoixTypeVille, new org.netbeans.lib.awtextra.AbsoluteConstraints(30, 40, -1, -1));
		
		// Liste �viter choix type ville
		ArrayListTransferHandlerPrefAvancees listeChoixTypeVilleNonHandler = new ArrayListTransferHandlerPrefAvancees(this);
		DefaultListModel listeChoixTypeVilleNonModel = new DefaultListModel();
		listeChoixTypeVilleNon = new JList(listeChoixTypeVilleNonModel);
		listeChoixTypeVilleNon.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
		listeChoixTypeVilleNon.setTransferHandler(listeChoixTypeVilleNonHandler);
		listeChoixTypeVilleNon.setDragEnabled(true);
		listeChoixTypeVilleNon.setName("listeChoixTypeVilleNon");
		//listeChoixTypeVilleNon.addMouseListener(new MouseListenerListeVilleHandler());
		listeChoixTypeVilleNonModel.addListDataListener(listDataHandler);
		scrollPaneChoixTypeVilleNon.setViewportView(listeChoixTypeVilleNon);
		this.add(scrollPaneChoixTypeVilleNon, new org.netbeans.lib.awtextra.AbsoluteConstraints(280, 140, 170, 70));

		// Icone �viter choix type ville
		ImageIcon iconChoixTypeVilleNon = new ImageIcon(PanelPrefAvancees.class.getResource("/fleches/evite3trans.gif"));
		JLabel labelChoixTypeVilleNon = new JLabel(iconChoixTypeVilleNon);
		this.add(labelChoixTypeVilleNon, new org.netbeans.lib.awtextra.AbsoluteConstraints(200, 170, -1, -1));

		// Icone suivre choix type ville
		ImageIcon iconChoixTypeVilleOui = new ImageIcon(PanelPrefAvancees.class.getResource("/fleches/passe_par3trans.png"));
		JLabel labelChoixTypeVilleOui = new JLabel(iconChoixTypeVilleOui);
		this.add(labelChoixTypeVilleOui, new org.netbeans.lib.awtextra.AbsoluteConstraints(180, 70, 80, -1));
		
		// Liste suivre choix type ville
		ArrayListTransferHandlerPrefAvancees listeChoixTypeVilleOuiHandler = new ArrayListTransferHandlerPrefAvancees(this);
		DefaultListModel listeChoixTypeVilleOuiModel = new DefaultListModel();
		listeChoixTypeVilleOui = new JList(listeChoixTypeVilleOuiModel);
		listeChoixTypeVilleOui.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
		listeChoixTypeVilleOui.setTransferHandler(listeChoixTypeVilleOuiHandler);
		listeChoixTypeVilleOui.setDragEnabled(true);
		listeChoixTypeVilleOui.setName("listeChoixTypeVilleOui");
		listeChoixTypeVilleOuiModel.addListDataListener(listDataHandler);
		//listeChoixTypeVilleOui.addMouseListener(new MouseListenerListeVilleHandler());
		scrollPaneChoixTypeVilleOui.setViewportView(listeChoixTypeVilleOui);
		this.add(scrollPaneChoixTypeVilleOui, new org.netbeans.lib.awtextra.AbsoluteConstraints(280, 60, 170, 70));
		
		// Liste choix type ville
		ArrayListTransferHandlerPrefAvancees listeChoixTypeVilleHandler = new ArrayListTransferHandlerPrefAvancees(this);
		DefaultListModel listeChoixTypeVilleModel = new DefaultListModel();
		
		// Remplir avec les intitul�s uniques
		LinkedList<TailleVille> tailles = TailleVilleFactory.getInstance().getAllInstances();
		for (TailleVille taille : tailles) {
			listeChoixTypeVilleModel.addElement(taille.intitule());
		}
		listeChoixTypeVilleModel.addElement(ATVGenerique.getInstance().intitule());
		
		listeChoixTypeVille = new JList(listeChoixTypeVilleModel);
		listeChoixTypeVille.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
		listeChoixTypeVille.setTransferHandler(listeChoixTypeVilleHandler);
		listeChoixTypeVille.setDragEnabled(true);
		listeChoixTypeVille.setName("listeChoixTypeVille");
		scrollPaneChoixTypeVille.setViewportView(listeChoixTypeVille);
		this.add(scrollPaneChoixTypeVille, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 70, 160, 130));
		
		// Label choix type route
		labelChoixTypeRoute.setText("Choix des caractéristiques des routes:");
		this.add(labelChoixTypeRoute, new org.netbeans.lib.awtextra.AbsoluteConstraints(30, 240, -1, -1));
		
		// Liste choix type route
		ArrayListTransferHandlerPrefAvancees listeChoixTypeRouteHandler = new ArrayListTransferHandlerPrefAvancees(this);
		DefaultListModel listeChoixTypeRouteModel = new DefaultListModel();
		
		// Remplir avec les intitul�s uniques
		LinkedList<Classement> classements = ClassementFactory.getInstance().getAllInstances();
		for (Classement classement : classements) {
			listeChoixTypeRouteModel.addElement(classement.intitule());
		}
		listeChoixTypeRouteModel.addElement(ATTGenerique.getInstance().intitule());
		listeChoixTypeRouteModel.addElement(Radar.getInstance().intitule());
		
		listeChoixTypeRoute = new JList(listeChoixTypeRouteModel);
		listeChoixTypeRoute.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
		listeChoixTypeRoute.setTransferHandler(listeChoixTypeRouteHandler);
		listeChoixTypeRoute.setDragEnabled(true);
		listeChoixTypeRoute.setName("listeChoixTypeRoute");
		
		scrollPaneChoixTypeRoute.setViewportView(listeChoixTypeRoute);
		scrollPaneChoixTypeRoute.setViewportView(listeChoixTypeRoute);
		this.add(scrollPaneChoixTypeRoute, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 270, 160, 140));

		// Icone �viter choix type route
		ImageIcon iconChoixTypeRouteNon = new ImageIcon(PanelPrefAvancees.class.getResource("/fleches/evite3trans.gif"));
		JLabel labelChoixTypeRouteNon = new JLabel(iconChoixTypeRouteNon);
		this.add(labelChoixTypeRouteNon, new org.netbeans.lib.awtextra.AbsoluteConstraints(180, 370, 80, -1));

		// Icone suivre choix type route
		ImageIcon iconChoixTypeRouteOui = new ImageIcon(PanelPrefAvancees.class.getResource("/fleches/passe_par3trans.png"));

		JLabel labelChoixTypeRouteOui = new JLabel(iconChoixTypeRouteOui);
		this.add(labelChoixTypeRouteOui, new org.netbeans.lib.awtextra.AbsoluteConstraints(180, 270, 80, -1));
		
		// Liste �viter choix type route
		ArrayListTransferHandlerPrefAvancees listeChoixTypeRouteNonHandler = new ArrayListTransferHandlerPrefAvancees(this);
		DefaultListModel listeChoixTypeRouteNonModel = new DefaultListModel();
		listeChoixTypeRouteNon = new JList(listeChoixTypeRouteNonModel);
		listeChoixTypeRouteNon.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
		listeChoixTypeRouteNon.setTransferHandler(listeChoixTypeRouteNonHandler);
		listeChoixTypeRouteNon.setDragEnabled(true);
		listeChoixTypeRouteNon.setName("listeChoixTypeRouteNon");
		
		listeChoixTypeRouteNonModel.addListDataListener(new ListDataHandler());
		scrollPaneChoixTypeRouteNon.setViewportView(listeChoixTypeRouteNon);
		this.add(scrollPaneChoixTypeRouteNon, new org.netbeans.lib.awtextra.AbsoluteConstraints(280, 350, 170, 70));
		
		// Liste suivre choix type route
		ArrayListTransferHandlerPrefAvancees listeChoixTypeRouteOuiHandler = new ArrayListTransferHandlerPrefAvancees(this);
		DefaultListModel listeChoixTypeRouteOuiModel = new DefaultListModel();
		listeChoixTypeRouteOui = new JList(listeChoixTypeRouteOuiModel);
		listeChoixTypeRouteOui.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
		listeChoixTypeRouteOui.setTransferHandler(listeChoixTypeRouteOuiHandler);
		listeChoixTypeRouteOui.setDragEnabled(true);
		listeChoixTypeRouteOui.setName("listeChoixTypeRouteOui");
		
		listeChoixTypeRouteOuiModel.addListDataListener(new ListDataHandler());
		scrollPaneChoixTypeRouteOui.setViewportView(listeChoixTypeRouteOui);
		this.add(scrollPaneChoixTypeRouteOui, new org.netbeans.lib.awtextra.AbsoluteConstraints(280, 260, 170, 70));
		
		// Label liste pr�f�rences avanc�es
		labelOrdrePrefAvancees.setText("Ordre des pr\u00e9f\u00e9rences:");
		this.add(labelOrdrePrefAvancees, new org.netbeans.lib.awtextra.AbsoluteConstraints(470, 120, -1, -1));
		
		// Bouton lancer la navigation
		boutonLanceNavigation.setText("Lancer la navigation");
		boutonLanceNavigation.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mouseClicked(java.awt.event.MouseEvent evt) {
				sourisNav2(evt);
			}
		});
		this.add(boutonLanceNavigation, new org.netbeans.lib.awtextra.AbsoluteConstraints(640, 420, -1, -1));
		
		// Bouton retour pr�f�rences simples
		boutonRetourPreferences.setText("Revenir aux pr\u00e9f\u00e9rences simples");
		boutonRetourPreferences.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mouseClicked(java.awt.event.MouseEvent evt) {
				sourisPrefSimples(evt);
			}
		});
		this.add(boutonRetourPreferences, new org.netbeans.lib.awtextra.AbsoluteConstraints(580, 380, -1, -1));
		
		// Bouton mont�e pr�f�rence avanc�e
		boutonPrefAvanceesHaut.setIcon(new ImageIcon(PanelPrefAvancees.class.getResource("/fleches/monter.png")));
		boutonPrefAvanceesHaut.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mouseClicked(java.awt.event.MouseEvent evt) {
				sourisUpPref(evt);
			}
		});
		this.add(boutonPrefAvanceesHaut, new org.netbeans.lib.awtextra.AbsoluteConstraints(720, 150, 50, 50));
		
		// Bouton descente pr�f�rence avanc�e
		boutonPrefAvanceesBas.setIcon(new ImageIcon(PanelPrefAvancees.class.getResource("/fleches/descendre.png")));
		boutonPrefAvanceesBas.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mouseClicked(java.awt.event.MouseEvent evt) {
				sourisDownPref(evt);
			}
		});
		this.add(boutonPrefAvanceesBas, new org.netbeans.lib.awtextra.AbsoluteConstraints(720, 270, 50, 50));
		
		// Liste des pr�f�rences avanc�es
		ArrayListTransferHandlerPrefAvancees listePrefAvanceesHandler = new ArrayListTransferHandlerPrefAvancees(this);

		DefaultListModel listePrefAvanceesModel = new DefaultListModel();
		Vector<String> preferences = new Vector<String>();
		initialisePrefAvancees(preferences);
		for (int i = 0; i < preferences.size(); i++) {
			listePrefAvanceesModel.addElement(preferences.get(i));
		}
		listePrefAvancees = new JList(listePrefAvanceesModel);
		listePrefAvancees.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
		listePrefAvancees.setTransferHandler(listePrefAvanceesHandler);
		listePrefAvancees.setDragEnabled(true);
		listePrefAvancees.setName("listePrefAvancees");
		scrollPanePrefAvancees.setViewportView(listePrefAvancees);
		this.add(scrollPanePrefAvancees, new org.netbeans.lib.awtextra.AbsoluteConstraints(500, 170, 190, 130));
	
	}
	

	private void initialisePrefAvancees(Vector<String> preferences) {
		// Lire dans les 4 cases de preferences des ville/route ce qui est selectionn� pour initialiser
		ListModel model;
		// 1. Ville
		//  a. Eviter
		model = this.listeChoixTypeVilleNon.getModel();
		for (int i = 0; i < model.getSize(); i++) {
			//System.out.println(model.getElementAt(i));
			preferences.add("Ville (éviter) : " + model.getElementAt(i));
		}
		
		//  b. Suivre
		model = this.listeChoixTypeVilleOui.getModel();
		for (int i = 0; i < model.getSize(); i++) {
			//	System.out.println(model.getElementAt(i));
			preferences.add("Ville (suivre) : " + model.getElementAt(i));
		}
		
		
		// 2. Route
		//  a. Eviter
		model = this.listeChoixTypeRouteNon.getModel();
		for (int i = 0; i < model.getSize(); i++) {
			//System.out.println(model.getElementAt(i));
			preferences.add("Route (éviter) : " + model.getElementAt(i));
		}
		
		//  b. Suivre
		model = this.listeChoixTypeRouteOui.getModel();
		for (int i = 0; i < model.getSize(); i++) {
			//System.out.println(model.getElementAt(i));
			preferences.add("Route (suivre) : " + model.getElementAt(i));
		}
	}

	private void sourisDownPref(java.awt.event.MouseEvent evt) {
		// D�placer la pr�f�rence s�lectionn�e vers le bas
		if (verbose) System.out.println("Déplacer la préférence sélectionnée vers le bas");
		if (listePrefAvancees.isSelectionEmpty()) return;
		if (listePrefAvancees.isSelectedIndex(listePrefAvancees.getModel().getSize() - 1)) return;
		
		DefaultListModel model = (DefaultListModel) listePrefAvancees.getModel();
		String tempSwap = (String) model.getElementAt(listePrefAvancees.getSelectedIndex() + 1);
		model.setElementAt((String) model.getElementAt(listePrefAvancees.getSelectedIndex()), listePrefAvancees.getSelectedIndex() + 1);
		model.setElementAt(tempSwap, listePrefAvancees.getSelectedIndex());
		
		listePrefAvancees.setSelectedIndex(listePrefAvancees.getSelectedIndex() + 1);
	}

	private void sourisUpPref(java.awt.event.MouseEvent evt) {
		// D�placer la pr�f�rence s�lectionn�e vers le haut.
		if (verbose) System.out.println("Déplacer la préférence sélectionnée vers le haut");
		if (listePrefAvancees.isSelectionEmpty()) return;
		if (listePrefAvancees.isSelectedIndex(0)) return;
		
		DefaultListModel model = (DefaultListModel) listePrefAvancees.getModel();
		String tempSwap = (String) model.getElementAt(listePrefAvancees.getSelectedIndex() - 1);
		model.setElementAt((String) model.getElementAt(listePrefAvancees.getSelectedIndex()), listePrefAvancees.getSelectedIndex() - 1);
		model.setElementAt(tempSwap, listePrefAvancees.getSelectedIndex());
		
		listePrefAvancees.setSelectedIndex(listePrefAvancees.getSelectedIndex() - 1);
	}
	
	// Affiche l'�cran pr�f�rences simples
	private void sourisPrefSimples(java.awt.event.MouseEvent evt) {
		if (evt.getButton() == java.awt.event.MouseEvent.BUTTON1){
			this.gps.affichePrefSimples(evt);
		}
	}

	// Affiche l'�cran de navigation 2
	public void sourisNav2(java.awt.event.MouseEvent evt) {
		if (evt.getButton() == java.awt.event.MouseEvent.BUTTON1){
			
			if (this.panelPrefSimples.exploiterPrefSimples() && this.exploiterPrefAvancees()) {
				// Affiche le panneau de navigation rempli avec le nouvel itin�raire
				this.gps.afficheNavigation();
			}
			
		}
	}
	
	public boolean exploiterPrefAvancees() {
		// Transmettre les pr�f�rences avanc�es � l'algo de calcul d'itin�raire
		DefaultListModel model = (DefaultListModel) listePrefAvancees.getModel();
		Pattern patternVille = Pattern.compile("(Ville) \\((.*)\\) : (.*)");
		Pattern patternRoute = Pattern.compile("(Route) \\((.*)\\) : (.*)");
		Matcher m;
		String typeCritere;
		String directive;
		String contenu;
		
		LinkedList<TailleVille> tailles = TailleVilleFactory.getInstance().getAllInstances();
		LinkedList<Classement> classements = ClassementFactory.getInstance().getAllInstances();
		
		for (int j = 0; j < model.getSize(); j++) {
			
			String tempPref = (String) model.get(j);
			if (verbose) System.out.println("Préférence avancée : " + tempPref);
			
			// Matcher le pattern
			m = patternVille.matcher(tempPref);
			if (!m.matches()) {
				m = patternRoute.matcher(tempPref);
				if (!m.matches()) continue;
			} 
			typeCritere = m.group(1);
			directive = m.group(2);
			contenu = m.group(3);
			
			System.out.println("typeCritere : " + typeCritere);
			System.out.println("directive : " + directive);
			System.out.println("contenu : " + contenu);
			
			// Ajouter la contrainte
			if (typeCritere.equals("Ville")) {
				if (directive.equals("suivre")) {
					if (contenu.equals(ATVGenerique.getInstance().intitule())) {
						// Ajouter une contrainte suivre ville touristique
						this.gps.controleur.addCritereVille(new CritereVilleTouristique(true, ATVGenerique.getInstance()));
					} else {
						// Ajouter une contrainte suivre une taille de ville
						for (TailleVille taille : tailles) {
							if (contenu.equals(taille.intitule()))
								this.gps.controleur.addCritereVille(new CritereTailleVille(true, taille));
						}
					}
				} else if (directive.equals("éviter")) {
					if (contenu.equals(ATVGenerique.getInstance().intitule())) {
						// Ajouter une contrainte suivre ville touristique
						this.gps.controleur.addCritereVille(new CritereVilleTouristique(false, ATVGenerique.getInstance()));
					} else {
						//this.ajouteCritereTailleVille(tailles, villesSuivre, contenu);
						// Ajouter une contrainte "suivre une taille de ville
						for (TailleVille taille : tailles) {
							if (contenu.equals(taille.intitule()))
								this.gps.controleur.addCritereVille(new CritereTailleVille(false, taille));
						}
					}
				}
			} else if (typeCritere.equals("Route")) {
				if (directive.equals("suivre")) {
					if (contenu.equals(ATTGenerique.getInstance().intitule())) {
						// Ajouter une contrainte suivre une route touristique
						this.gps.controleur.addCritereTroncon(new CritereTronconTouristique(true, ATTGenerique.getInstance()));
					} else if (contenu.equals(Radar.getInstance().intitule())) {
						// Ajouter une contrainte suivre radar
						this.gps.controleur.addCritereTroncon(new CritereTronconRadar(true));
					} else {
						// Identifier le type de contrainte
						for (Classement classement : classements) {
							if (contenu.equals(classement.intitule()))
								this.gps.controleur.addCritereTroncon(new CritereClassementTroncon(true, classement));
						}
					}
				} else if (directive.equals("éviter")) {
					if (contenu.equals(ATTGenerique.getInstance().intitule())) {
						// Ajouter une contrainte �viter une route touristique
						this.gps.controleur.addCritereTroncon(new CritereTronconTouristique(false, ATTGenerique.getInstance()));
					} else if (contenu.equals(Radar.getInstance().intitule())) {
						// Ajouter une contrainte �viter radar
						this.gps.controleur.addCritereTroncon(new CritereTronconRadar(false));
					} else {
						// Identifier le type de contrainte
						for (Classement classement : classements) {
							if (contenu.equals(classement.intitule()))
								this.gps.controleur.addCritereTroncon(new CritereClassementTroncon(false, classement));
						}
					}
				}
			} else continue;
			
		}
		
		// Lire les vitesses min/max
		System.out.println("Vitesse min=" + vitesseMin);
		System.out.println("Vitesse max=" + vitesseMax);
		
		// FIXME laisser des int ou mettre des float...?
		this.gps.controleur.addCritereTroncon(new CritereVitesseTroncon((int)vitesseMin, (int)vitesseMax));
		
//		// Verif du bon ajout
//		if (verbose) {
//			LinkedList<CritereVille> criteresVille = this.gps.controleur.getCriteresVilles();
//			CritereTypeVilles ctv = null;
//			LinkedList<CritereTroncon> criteresTroncon = this.gps.controleur.getCriteresTroncons();
//			CritereTypeTroncons ctt = null;
//			
//			System.out.println("Size : " + criteresTroncon.size());
//			for (CritereTroncon critereTroncon : criteresTroncon) {
//				ctt = (CritereTypeTroncons) critereTroncon;
//				System.out.println("Favoriser : " + ctt.favoriser);
//				System.out.println("vitesseMin : " + ctt.vitesseMin);
//				System.out.println("vitesseMax : " + ctt.vitesseMax);
//				if (ctt.atoutTouristique != null) System.out.println("atoutTouristique : " + ctt.atoutTouristique.intitule());
//				if (ctt.classement != null) System.out.println("classement : " + ctt.classement.intitule());
//				System.out.println("radar : " + ctt.radar);
//				System.out.println("\n");
//			}
//			
//			System.out.println("Size : " + criteresVille.size());
//			for (CritereVille critereVille : criteresVille) {
//				ctv = (CritereTypeVilles) critereVille;
//				System.out.println("Favoriser : " + ctv.favoriser);
//				if (ctv.taille != null) System.out.println("taille : " + ctv.taille.intitule());
//				if (ctv.atoutTouristique != null) System.out.println("atoutTouristique : " + ctv.atoutTouristique.intitule());
//				System.out.println("\n");
//			}
//		}
		
		return true;
	}

	/** Returns an ImageIcon, or null if the path was invalid. */
    protected static ImageIcon createImageIcon(String path,
                                               String description) {
        java.net.URL imgURL = PanelPrefAvancees.class.getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL, description);
        } else {
            System.err.println("Couldn't find file: " + path);
            return null;
        }
    }
    
    
    class MouseListenerListeRouteHandler implements MouseListener {
			
			String temp;
			
			@Override
			public void mouseClicked(MouseEvent arg0) {}

			@Override
			public void mouseEntered(MouseEvent arg0) {
				System.out.println("listeChoixTypeRouteNon enter");
				listeChoixTypeRoute.setBorder(BorderFactory.createLineBorder(Color.GREEN));
				listeChoixTypeRoute.setBackground(Color.GREEN);
				listeChoixTypeRouteOui.setBorder(BorderFactory.createLineBorder(Color.GREEN));
				listeChoixTypeRouteOui.setBackground(Color.GREEN);
				listeChoixTypeRouteNon.setBorder(BorderFactory.createLineBorder(Color.GREEN));
				listeChoixTypeRouteNon.setBackground(Color.GREEN);
				temp = labelChoixTypeRoute.getText();
				labelChoixTypeRoute.setText("Faites maintenant glisser un élément");
				
				labelChoixTypeRoute.setFont(new Font(labelChoixTypeRoute.getFont().getFontName(), Font.ITALIC, labelChoixTypeRoute.getFont().getSize()));
			}

			@Override
			public void mouseExited(MouseEvent arg0) {
				System.out.println("listeChoixTypeRouteNon exit");
				listeChoixTypeRoute.setBorder(null);
				listeChoixTypeRoute.setBackground(Color.WHITE);
				listeChoixTypeRouteOui.setBorder(null);
				listeChoixTypeRouteOui.setBackground(Color.WHITE);
				listeChoixTypeRouteNon.setBorder(null);
				listeChoixTypeRouteNon.setBackground(Color.WHITE);
				labelChoixTypeRoute.setText(temp);
				labelChoixTypeRoute.setFont(new Font(labelChoixTypeRoute.getFont().getFontName(), Font.PLAIN, labelChoixTypeRoute.getFont().getSize()));
			}

			@Override
			public void mousePressed(MouseEvent arg0) {}

			@Override
			public void mouseReleased(MouseEvent arg0) {}
    }
    
    class MouseListenerListeVilleHandler implements MouseListener {
		
		String temp;
		
		@Override
		public void mouseClicked(MouseEvent arg0) {}

		@Override
		public void mouseEntered(MouseEvent arg0) {
			System.out.println("listeChoixTypeRouteNon enter");
			listeChoixTypeVille.setBorder(BorderFactory.createLineBorder(Color.GREEN));
			listeChoixTypeVille.setBackground(Color.GREEN);
			listeChoixTypeVilleOui.setBorder(BorderFactory.createLineBorder(Color.GREEN));
			listeChoixTypeVilleOui.setBackground(Color.GREEN);
			listeChoixTypeVilleNon.setBorder(BorderFactory.createLineBorder(Color.GREEN));
			listeChoixTypeVilleNon.setBackground(Color.GREEN);
			temp = labelChoixTypeVille.getText();
			labelChoixTypeVille.setText("Faites maintenant glisser un élément");
			
			labelChoixTypeVille.setFont(new Font(labelChoixTypeVille.getFont().getFontName(), Font.ITALIC, labelChoixTypeVille.getFont().getSize()));
		}

		@Override
		public void mouseExited(MouseEvent arg0) {
			System.out.println("listeChoixTypeVilleNon exit");
			listeChoixTypeVille.setBorder(null);
			listeChoixTypeVille.setBackground(Color.WHITE);
			listeChoixTypeVilleOui.setBorder(null);
			listeChoixTypeVilleOui.setBackground(Color.WHITE);
			listeChoixTypeVilleNon.setBorder(null);
			listeChoixTypeVilleNon.setBackground(Color.WHITE);
			labelChoixTypeVille.setText(temp);
			labelChoixTypeVille.setFont(new Font(labelChoixTypeVille.getFont().getFontName(), Font.PLAIN, labelChoixTypeVille.getFont().getSize()));
		}

		@Override
		public void mousePressed(MouseEvent arg0) {}

		@Override
		public void mouseReleased(MouseEvent arg0) {}
}
    
	class ListDataHandler implements ListDataListener {
		@Override
		public void contentsChanged(ListDataEvent e) {
			
		}

		@Override
		public void intervalRemoved(ListDataEvent e) {
			if (verbose) System.out.println("intervalRemoved");
			
			// Supprimer dans la liste des pref avanc�es de ce qui vient d'�tre supprim�
			DefaultListModel theModel = (DefaultListModel) e.getSource();
			DefaultListModel listePrefAvanceesModel = (DefaultListModel) listePrefAvancees.getModel();
			DefaultListModel listeModel = null;
			DefaultListModel listeModelOpp = null;
			String prefType = null;
			String instruction = null;
			String instructionOpp = null;
			
			if (theModel == (DefaultListModel)listeChoixTypeVilleOui.getModel()) {
				listeModel = (DefaultListModel) listeChoixTypeVilleOui.getModel();
				listeModelOpp = (DefaultListModel) listeChoixTypeVilleNon.getModel();
				prefType = "Ville";
				instruction = "suivre";
				instructionOpp = "éviter";
			} else if (theModel == (DefaultListModel)listeChoixTypeVilleNon.getModel()) {
				listeModel = (DefaultListModel) listeChoixTypeVilleNon.getModel();
				listeModelOpp = (DefaultListModel) listeChoixTypeVilleOui.getModel();
				prefType = "Ville";
				instruction = "éviter";
				instructionOpp = "suivre";
			} else if (theModel == (DefaultListModel)listeChoixTypeRouteOui.getModel()) {
				listeModel = (DefaultListModel) listeChoixTypeRouteOui.getModel();
				listeModelOpp = (DefaultListModel) listeChoixTypeRouteNon.getModel();
				prefType = "Route";
				instruction = "suivre";
				instructionOpp = "éviter";
			} else if (theModel == (DefaultListModel)listeChoixTypeRouteNon.getModel()) {
				listeModel = (DefaultListModel) listeChoixTypeRouteNon.getModel();
				listeModelOpp = (DefaultListModel) listeChoixTypeRouteOui.getModel();
				prefType = "Route";
				instruction = "éviter";
				instructionOpp = "suivre";
			}
			if (listeModel != null) {
				removeOldPreference(listeModel, prefType, instruction, listePrefAvanceesModel);
				addNewPreference(listeModelOpp, prefType, instructionOpp, listePrefAvanceesModel);
			} else return;
		}

		private void removeOldPreference(DefaultListModel listeModel, String prefType, String instruction, DefaultListModel listePrefAvanceesModel) {
			for (int i = 0; i < listePrefAvanceesModel.getSize(); i++) {
				String tempPref = (String) listePrefAvanceesModel.get(i);
				if (!tempPref.startsWith(prefType)) continue;
				if (!tempPref.contains(instruction)) continue;
				if (verbose) System.out.println("A supprimer? : " + tempPref);
				boolean hasBeenRemoved = true;
				int j = 0;
				while ((j < listeModel.getSize()) && (hasBeenRemoved)) {
					String tempRemove = (String) listeModel.get(j);
					if (verbose) System.out.println(" Comparaison : " + tempRemove);
					if (tempPref.endsWith(tempRemove)) {
						if (verbose) System.out.println(" trouve");
						hasBeenRemoved = false;
					}
					j++;
				}
				if (hasBeenRemoved) {
					// On doit supprimer dans la liste des preferences avanc�es celle qui n'existe plus
					if (verbose) System.out.println("  Supprime : " + tempPref);
					listePrefAvanceesModel.remove(i);
					break;
				}
			}
		}
		
		@Override
		public void intervalAdded(ListDataEvent e) {
			// Ajouter en fin de liste des pref avanc�es de ce qui vient d'�tre ajout�
			DefaultListModel theModel = (DefaultListModel) e.getSource();
			DefaultListModel listePrefAvanceesModel = (DefaultListModel) listePrefAvancees.getModel();
			DefaultListModel listeModel = null;
			String prefType = null;
			String instruction = null;

			if (theModel == (DefaultListModel)listeChoixTypeVilleOui.getModel()) {
				listeModel = (DefaultListModel) listeChoixTypeVilleOui.getModel();
				prefType = "Ville";
				instruction = "suivre";
			} else if (theModel == (DefaultListModel)listeChoixTypeVilleNon.getModel()) {
				listeModel = (DefaultListModel) listeChoixTypeVilleNon.getModel();
				prefType = "Ville";
				instruction = "éviter";
			} else if (theModel == (DefaultListModel)listeChoixTypeRouteOui.getModel()) {
				listeModel = (DefaultListModel) listeChoixTypeRouteOui.getModel();
				prefType = "Route";
				instruction = "suivre";
			} else if (theModel == (DefaultListModel)listeChoixTypeRouteNon.getModel()) {
				listeModel = (DefaultListModel) listeChoixTypeRouteNon.getModel();
				prefType = "Route";
				instruction = "éviter";
			}
			if (listeModel != null) {
				addNewPreference(listeModel, prefType, instruction, listePrefAvanceesModel);
			} else return;
		}

		private void addNewPreference(DefaultListModel listeModel, String prefType, String instruction, DefaultListModel listePrefAvanceesModel) {
			for (int i = 0; i < listeModel.getSize(); i++) {
				String tempAdd = (String) listeModel.get(i);
				if (verbose) System.out.println("A ajouter? : " + tempAdd);
				boolean found = false;
				for (int j = 0; j < listePrefAvanceesModel.getSize(); j++) {
					String tempPref = (String) listePrefAvanceesModel.get(j);
					if (verbose) System.out.println(" pref avancees : " + tempPref);
					if (tempPref.endsWith(tempAdd)) {
						found = true;
					}
				}
				if (!found) {
					// On ajoute celui qui manque
					if (verbose) System.out.println("  ajoute : " + tempAdd);
					listePrefAvanceesModel.add(listePrefAvanceesModel.getSize(), prefType + " (" + instruction + ") : " + tempAdd);
				}
			}
		}

	}
	
	public class ArrayListTransferHandlerPrefAvancees extends TransferHandler {
		
		private static final long serialVersionUID = -4387070255003751257L;
		DataFlavor localArrayListFlavor, serialArrayListFlavor;
	    String localArrayListType = DataFlavor.javaJVMLocalObjectMimeType + ";class=java.util.ArrayList";
	    JList source = null;
	    int[] indices = null;
	    int addIndex = -1; //Location where items were added
	    int addCount = 0;  //Number of items added
	    private boolean verbose = false;
	    
	    PanelPrefAvancees panelPrefAvancees;

	    // Le handler conserve une reference sur le panel dans lequel le drag n drop est fait pour
	    // des verifications ulterieures
	    public ArrayListTransferHandlerPrefAvancees(PanelPrefAvancees panelPrefAvancees) {
	    	this.panelPrefAvancees = panelPrefAvancees;
	        try {
	            localArrayListFlavor = new DataFlavor(localArrayListType);
	        } catch (ClassNotFoundException e) {
	            System.out.println("ArrayListTransferHandler: unable to create data flavor");
	        }
	        serialArrayListFlavor = new DataFlavor(ArrayList.class, "ArrayList");
	    }

	    public boolean importData(JComponent c, Transferable t) {
	        JList target = null;
	        ArrayList alist = null;
	        if (!canImport(c, t.getTransferDataFlavors())) {
	            return false;
	        }
	        try {
	            target = (JList)c;
	            if (hasLocalArrayListFlavor(t.getTransferDataFlavors())) {
	                alist = (ArrayList)t.getTransferData(localArrayListFlavor);
	            } else if (hasSerialArrayListFlavor(t.getTransferDataFlavors())) {
	                alist = (ArrayList)t.getTransferData(serialArrayListFlavor);
	            } else {
	                return false;
	            }
	        } catch (UnsupportedFlavorException ufe) {
	            System.out.println("importData: unsupported data flavor");
	            return false;
	        } catch (IOException ioe) {
	            System.out.println("importData: I/O exception");
	            return false;
	        }
	        
	        // On repasse toutes les zones de drop a leur couleur par defaut
	        this.panelPrefAvancees.listeChoixTypeVille.setBorder(null);
	    	this.panelPrefAvancees.listeChoixTypeVille.setBackground(Color.WHITE);
	    	this.panelPrefAvancees.listeChoixTypeVilleOui.setBorder(null);
	    	this.panelPrefAvancees.listeChoixTypeVilleOui.setBackground(Color.WHITE);
	    	this.panelPrefAvancees.listeChoixTypeVilleNon.setBorder(null);
	    	this.panelPrefAvancees.listeChoixTypeVilleNon.setBackground(Color.WHITE);
	    	
	    	this.panelPrefAvancees.listeChoixTypeRoute.setBorder(null);
	    	this.panelPrefAvancees.listeChoixTypeRoute.setBackground(Color.WHITE);
	    	this.panelPrefAvancees.listeChoixTypeRouteOui.setBorder(null);
	    	this.panelPrefAvancees.listeChoixTypeRouteOui.setBackground(Color.WHITE);
	    	this.panelPrefAvancees.listeChoixTypeRouteNon.setBorder(null);
	    	this.panelPrefAvancees.listeChoixTypeRouteNon.setBackground(Color.WHITE);
	    	
	    	this.panelPrefAvancees.listePrefAvancees.setBorder(null);
	    	this.panelPrefAvancees.listePrefAvancees.setBackground(Color.WHITE);
	        
	        // On doit v�rifier maintenant qu'il est possible de droper la source dans la target.
	        if (verbose) System.out.println(this.panelPrefAvancees.listeOrigine);
	        if (verbose)  System.out.println(target.getName());
	        
	        if (this.panelPrefAvancees.listeOrigine.equals(this.panelPrefAvancees.listePrefAvancees.getName())) {
				if (!target.getName().equals(this.panelPrefAvancees.listePrefAvancees.getName())) {
					if (verbose) System.out.println("deplacement impossible");
					return false;
				}
			}
	        
	        if (this.panelPrefAvancees.listeOrigine.equals(this.panelPrefAvancees.listeChoixTypeVille.getName())) {
				if ((!target.getName().equals(this.panelPrefAvancees.listeChoixTypeVilleOui.getName()))
						&& (!target.getName().equals(this.panelPrefAvancees.listeChoixTypeVilleNon.getName()))) {
					if (verbose) System.out.println("deplacement impossible");
					return false;
				}
			}
	        
	        if (this.panelPrefAvancees.listeOrigine.equals(this.panelPrefAvancees.listeChoixTypeVilleOui.getName())) {
				if ((!target.getName().equals(this.panelPrefAvancees.listeChoixTypeVille.getName()))
						&& (!target.getName().equals(this.panelPrefAvancees.listeChoixTypeVilleNon.getName()))) {
					if (verbose) System.out.println("deplacement impossible");
					return false;
				}
			}
	        
	        if (this.panelPrefAvancees.listeOrigine.equals(this.panelPrefAvancees.listeChoixTypeVilleNon.getName())) {
				if ((!target.getName().equals(this.panelPrefAvancees.listeChoixTypeVille.getName()))
						&& (!target.getName().equals(this.panelPrefAvancees.listeChoixTypeVilleOui.getName()))) {
					if (verbose) System.out.println("deplacement impossible");
					return false;
				}
			}
	        
	        if (this.panelPrefAvancees.listeOrigine.equals(this.panelPrefAvancees.listeChoixTypeRoute.getName())) {
				if ((!target.getName().equals(this.panelPrefAvancees.listeChoixTypeRouteOui.getName()))
						&& (!target.getName().equals(this.panelPrefAvancees.listeChoixTypeRouteNon.getName()))) {
					if (verbose) System.out.println("deplacement impossible");
					return false;
				}
			}
	        
	        if (this.panelPrefAvancees.listeOrigine.equals(this.panelPrefAvancees.listeChoixTypeRouteOui.getName())) {
				if ((!target.getName().equals(this.panelPrefAvancees.listeChoixTypeRoute.getName()))
						&& (!target.getName().equals(this.panelPrefAvancees.listeChoixTypeRouteNon.getName()))) {
					if (verbose) System.out.println("deplacement impossible");
					return false;
				}
			}
	        
	        if (this.panelPrefAvancees.listeOrigine.equals(this.panelPrefAvancees.listeChoixTypeRouteNon.getName())) {
				if ((!target.getName().equals(this.panelPrefAvancees.listeChoixTypeRoute.getName()))
						&& (!target.getName().equals(this.panelPrefAvancees.listeChoixTypeRouteOui.getName()))) {
					if (verbose) System.out.println("deplacement impossible");
					return false;
				}
			}
	        
	        //At this point we use the same code to retrieve the data
	        //locally or serially.

	        //We'll drop at the current selected index.
	        int index = target.getSelectedIndex();

	        //Prevent the user from dropping data back on itself.
	        //For example, if the user is moving items #4,#5,#6 and #7 and
	        //attempts to insert the items after item #5, this would
	        //be problematic when removing the original items.
	        //This is interpreted as dropping the same data on itself
	        //and has no effect.
//	        if (source.equals(target)) {
//	            if (indices != null && index >= indices[0] - 1 &&
//	                  index <= indices[indices.length - 1]) {
//	                indices = null;
//	                return true;
//	            }
//	        }

	        DefaultListModel listModel = (DefaultListModel)target.getModel();
	        int max = listModel.getSize();
	        if (index < 0) {
	            index = max; 
	        } else {
	            index++;
	            if (index > max) {
	                index = max;
	            }
	        }
	        addIndex = index;
	        addCount = alist.size();
	        for (int i=0; i < alist.size(); i++) {
	            listModel.add(index++, alist.get(i));
	        }
	        return true;
	    }

	    protected void exportDone(JComponent c, Transferable data, int action) {
	        if ((action == MOVE) && (indices != null)) {
	            DefaultListModel model = (DefaultListModel)source.getModel();
	            
	            this.panelPrefAvancees.isDragging = false;
	            
	            //If we are moving items around in the same list, we
	            //need to adjust the indices accordingly since those
	            //after the insertion point have moved.
	            if (addCount > 0) {
	                for (int i = 0; i < indices.length; i++) {
	                    if (indices[i] > addIndex) {
	                        indices[i] += addCount;
	                    }
	                }
	            }
	            for (int i = indices.length -1; i >= 0; i--)
	                model.remove(indices[i]);
	        }
	        indices = null;
	        addIndex = -1;
	        addCount = 0;
	    }

	    private boolean hasLocalArrayListFlavor(DataFlavor[] flavors) {
	        if (localArrayListFlavor == null) {
	            return false;
	        }

	        for (int i = 0; i < flavors.length; i++) {
	            if (flavors[i].equals(localArrayListFlavor)) {
	                return true;
	            }
	        }
	        return false;
	    }

	    private boolean hasSerialArrayListFlavor(DataFlavor[] flavors) {
	        if (serialArrayListFlavor == null) {
	            return false;
	        }

	        for (int i = 0; i < flavors.length; i++) {
	            if (flavors[i].equals(serialArrayListFlavor)) {
	                return true;
	            }
	        }
	        return false;
	    }

	    public boolean canImport(JComponent c, DataFlavor[] flavors) {
//	    	if (this.panelPrefAvancees.isDragging) {
//				System.out.println("isDragging");
//				if (this.panelPrefAvancees.listeSurvol != null) {
//					System.out.println(this.panelPrefAvancees.listeSurvol.getName());
//					MouseListener[] zob = this.panelPrefAvancees.listeSurvol.getMouseListeners();
//				}
//			}
	        if (hasLocalArrayListFlavor(flavors))  { return true; }
	        if (hasSerialArrayListFlavor(flavors)) { return true; }
	        return false;
	    }

	    protected Transferable createTransferable(JComponent c) {
	        if (c instanceof JList) {
	            source = (JList)c;
	            
	            this.panelPrefAvancees.origineDragging = source;
	            this.panelPrefAvancees.isDragging = true;
	            String temp = new String(source.getName().getBytes());
	            this.panelPrefAvancees.listeOrigine = new String(temp.getBytes());
	            
	            // Eclairer ou on peut dropper
	            if (source.equals(this.panelPrefAvancees.listeChoixTypeVille)) {
	            	this.panelPrefAvancees.listeChoixTypeVilleOui.setBorder(BorderFactory.createLineBorder(Color.GREEN));
	            	this.panelPrefAvancees.listeChoixTypeVilleOui.setBackground(Color.GREEN);
	            	this.panelPrefAvancees.listeChoixTypeVilleNon.setBorder(BorderFactory.createLineBorder(Color.GREEN));
	            	this.panelPrefAvancees.listeChoixTypeVilleNon.setBackground(Color.GREEN);
				}
	            if (source.equals(this.panelPrefAvancees.listeChoixTypeVilleOui)) {
	            	this.panelPrefAvancees.listeChoixTypeVille.setBorder(BorderFactory.createLineBorder(Color.GREEN));
	            	this.panelPrefAvancees.listeChoixTypeVille.setBackground(Color.GREEN);
	            	this.panelPrefAvancees.listeChoixTypeVilleNon.setBorder(BorderFactory.createLineBorder(Color.GREEN));
	            	this.panelPrefAvancees.listeChoixTypeVilleNon.setBackground(Color.GREEN);
				}
	            if (source.equals(this.panelPrefAvancees.listeChoixTypeVilleNon)) {
	            	this.panelPrefAvancees.listeChoixTypeVilleOui.setBorder(BorderFactory.createLineBorder(Color.GREEN));
	            	this.panelPrefAvancees.listeChoixTypeVilleOui.setBackground(Color.GREEN);
	            	this.panelPrefAvancees.listeChoixTypeVille.setBorder(BorderFactory.createLineBorder(Color.GREEN));
	            	this.panelPrefAvancees.listeChoixTypeVille.setBackground(Color.GREEN);
				}
	            
	            if (source.equals(this.panelPrefAvancees.listeChoixTypeRoute)) {
	            	this.panelPrefAvancees.listeChoixTypeRouteOui.setBorder(BorderFactory.createLineBorder(Color.GREEN));
	            	this.panelPrefAvancees.listeChoixTypeRouteOui.setBackground(Color.GREEN);
	            	this.panelPrefAvancees.listeChoixTypeRouteNon.setBorder(BorderFactory.createLineBorder(Color.GREEN));
	            	this.panelPrefAvancees.listeChoixTypeRouteNon.setBackground(Color.GREEN);
				}
	            if (source.equals(this.panelPrefAvancees.listeChoixTypeRouteOui)) {
	            	this.panelPrefAvancees.listeChoixTypeRoute.setBorder(BorderFactory.createLineBorder(Color.GREEN));
	            	this.panelPrefAvancees.listeChoixTypeRoute.setBackground(Color.GREEN);
	            	this.panelPrefAvancees.listeChoixTypeRouteNon.setBorder(BorderFactory.createLineBorder(Color.GREEN));
	            	this.panelPrefAvancees.listeChoixTypeRouteNon.setBackground(Color.GREEN);
				}
	            if (source.equals(this.panelPrefAvancees.listeChoixTypeRouteNon)) {
	            	this.panelPrefAvancees.listeChoixTypeRouteOui.setBorder(BorderFactory.createLineBorder(Color.GREEN));
	            	this.panelPrefAvancees.listeChoixTypeRouteOui.setBackground(Color.GREEN);
	            	this.panelPrefAvancees.listeChoixTypeRoute.setBorder(BorderFactory.createLineBorder(Color.GREEN));
	            	this.panelPrefAvancees.listeChoixTypeRoute.setBackground(Color.GREEN);
				}
	            if (source.equals(this.panelPrefAvancees.listePrefAvancees)) {
	            	this.panelPrefAvancees.listePrefAvancees.setBorder(BorderFactory.createLineBorder(Color.GREEN));
	            	this.panelPrefAvancees.listePrefAvancees.setBackground(Color.GREEN);
				}
	            
	            indices = source.getSelectedIndices();
	            Object[] values = source.getSelectedValues();
	            if (values == null || values.length == 0) {
	                return null;
	            }
	            ArrayList alist = new ArrayList(values.length);
	            for (int i = 0; i < values.length; i++) {
	                Object o = values[i];
	                String str = o.toString();
	                if (str == null) str = "";
	                alist.add(str);
	            }
	            return new ArrayListTransferable(alist);
	        }
	        return null;
	    }

	    public int getSourceActions(JComponent c) {
	        return COPY_OR_MOVE;
	    }

	    public class ArrayListTransferable implements Transferable {
	        ArrayList data;

	        public ArrayListTransferable(ArrayList alist) {
	            data = alist;
	        }

	        public Object getTransferData(DataFlavor flavor)
	                                 throws UnsupportedFlavorException {
	        	if (!isDataFlavorSupported(flavor)) {
	                throw new UnsupportedFlavorException(flavor);
	            }
	            return data;
	        }

	        public DataFlavor[] getTransferDataFlavors() {
	            return new DataFlavor[] { localArrayListFlavor,
	                                      serialArrayListFlavor };
	        }

	        public boolean isDataFlavorSupported(DataFlavor flavor) {
	            if (localArrayListFlavor.equals(flavor)) {
	                return true;
	            }
	            if (serialArrayListFlavor.equals(flavor)) {
	                return true;
	            }
	            return false;
	        }
	    }
	}

	public void setReferencePanelPrefSimples(PanelPrefSimples panelPrefSimples) {
		this.panelPrefSimples = panelPrefSimples;
	}


}
